package org.amicofragile.websample.hello;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.amicofragile.websample.model.GreetingsComposer;

public class MVCSampleServlet extends HttpServlet {
	private GreetingsComposer composer;
	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		composer = new GreetingsComposer("MVC Hello");
	}
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doAction(request, response);
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doAction(request, response);
	}
	// Controller vero e proprio: riceve il controllo da doGet e doPost
	private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Recupero il valore da utilizzare come input nella composizione del messaggio
		String to = getParameter(request, "to", "world");
		// Compone il messaggio utilizzando una classe di "modello"
		String message = composer.composeMessage(to);
		// Prepara il contesto per la view
		request.setAttribute("_message", message);
		// Passa il controllo alla view, che genererà l'output html
		forwardTo("/hello.jsp", request, response);
	}
	
	private String getParameter(HttpServletRequest request, String name, String defaultValue) {
		HttpSession session = request.getSession();
		// Accesso ai parametri della request HTTP - Non importa se GET o POST
		String val = request.getParameter(name);
		if(val == null) {
			val = getParameterFromUrl(request.getPathInfo());
			if(val == null) { 
				val = (String)session.getAttribute("saved_" + name);
				if(val == null) {
					val = defaultValue;
				}
			}
		}
		// Accesso in scrittura agli attributi del contesto di sessione
		session.setAttribute("saved_" + name, val);
		return val;
	}
	
	private String getParameterFromUrl(String pathInfo) {
		String param = pathInfo.substring(1);
		if(!"".equals(param))
			return param;
		return null;
	}
	private void forwardTo(String page, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);
		dispatcher.forward(request, response);
	}
}
